package com.example.forum.services;


import com.example.forum.model.User;

import java.util.List;
import java.util.Map;

/**
 * 用户接口
 */
public interface IUserService {

    /**
     * 创建一个普通用户
     * @param user
     */
    void createNormalUser(User user);

    /**
     * 创建用户（管理员功能）
     * @param user 用户实体
     */
    void createUser(User user);

    /**
     * 根据用户名查询用户信息
     * @param username 用户名
     * @return 查询到的对象
     */
    User selectByUserName(String username);

    /**
     * 根据用户名查询用户信息（用于身份验证）
     * @param username 用户名
     * @return 查询到的用户对象
     */
    User selectByUsername(String username);

    /**
     * 处理用户登录
     * @param username 用户名
     * @param password 密码
     * @return
     */
    User login(String username,String password);

    /**
     *  根据id查询用户信息
     * @param id  传入的id
     * @return 查询的User对象
     */
    User selectById(Long id);

    /**
     * 用户文章数量+1
     */
    void addOneArticleCountById(Long id);

    /**
     * 用户文章数量-1
     */
    void subOneArticleCountById(Long id);

    /**
     * 用户评论数量+1
     */
    void addOneCommentCountById(Long id);

    /**
     * 用户评论数量-1
     */
    void subOneCommentCountById(Long id);

    /**
     * 用户获赞数量+1
     */
    void addOneLikeCountById(Long id);

    /**
     * 用户获赞数量-1
     */
    void subOneLikeCountById(Long id);

    /**
     * 修改个人信息
     * @param user  修改后的个人信息对象
     */
    void modifyInfo(User user);

    /**
     * 修改密码
     * @param id  用户id
     * @param newPassword  新密码
     * @param oldPassword  老密码
     */
    void modifyPassword(Long id,String newPassword,String oldPassword);
    
    /**
     * 获取所有用户
     * @return 用户列表
     */
    List<User> getAllUsers();
    
    /**
     * 更新用户状态（管理员功能）
     * @param userId 用户ID
     * @param state 状态值（0正常，1禁言）
     */
    void updateUserState(Long userId, Byte state);
    
    /**
     * 删除用户（管理员功能）
     * @param userId 用户ID
     */
    void deleteUser(Long userId);
    
    /**
     * 更新用户的管理员权限（超级管理员功能）
     * @param userId 用户ID
     * @param isAdmin 是否为管理员（0普通用户，1管理员）
     */
    void updateUserAdmin(Long userId, Byte isAdmin);
    
    /**
     * 管理员更新用户信息（管理员专用）
     * @param user 包含要更新字段的用户对象
     */
    void updateUserByAdmin(User user);
    
    /**
     * 获取系统统计信息（管理员功能）
     * @return 系统统计信息
     */
    Map<String, Object> getSystemStats();
    
    /**
     * 统计总用户数（未删除的）
     * @return 用户总数
     */
    int countTotalUsers();
    
    /**
     * 统计今日新增用户数
     * @return 今日新增用户数
     */
    int countTodayNewUsers();

    /**
     * 获取活跃用户列表（根据文章数量排序）
     * @param limit 返回的用户数量
     * @return 活跃用户列表
     */
    List<User> getActiveUsers(int limit);
    
    /**
     * 获取用户统计信息
     * @param userId 用户ID
     * @return 包含评论数和获赞数的Map
     */
    Map<String, Object> getUserStats(Long userId);
    
    /**
     * 分页获取用户列表
     * @param page 页码
     * @param size 每页数量
     * @param sort 排序字段
     * @param order 排序方向
     * @return 包含用户列表和总数的Map
     */
    Map<String, Object> getUsersByPage(int page, int size, String sort, String order);

    /**
     * 根据用户ID获取用户基本信息
     * @param userId 用户ID
     * @return 包含用户基本信息的Map
     */
    Map<String, Object> selectUserInfoById(Long userId);
}
